Threads are instances of software processes operating on a computer system. In operation, when a first user object has a task that needs to be performed, a master thread associates an available worker thread with the user object. Once the task has been completed, the first user object is placed in a wait state until it has another task to be performed and the worker thread is returned to a thread pool to be associated with another user having a task to be performed. When the first user object has another task to be performed, it is likely that a different thread will be assigned thereto to perform that task. A problem exists in that a thread can get “hung” or “hung up”. This can occur for many reasons. One reason is that there is contention for system resources such as memory resources, processor resources, and network resources. For example, assuming a first thread locks a resource, when a second thread needs to use the same resource, the second thread will wait for the first thread to release, or unlock, the resource. If the first thread crashes or is for some other reason unable to unlock the resource, the second thread will get hung.
Additionally, a thread could get hung due to an error in a communications subsystem, such as a mail application programming interface (“API”). When a thread makes a call to the subsystem, the thread is locked in and at the mercy of that subsystem. If there is a crash in the subsystem, the thread will be hung. The same scenario also applies on the case of operating systems. It is also possible that the subsystem could get hung itself, which would hang the calling thread.
Finally, a thread could get hung as a result of a network request taking an excessively long time to complete, due to poor network conditions or hardware issues (such as domain controllers being down, routers/repeaters being down), for example. In this scenario, the thread gets hung waiting for the network to return.
Hang up conditions waste valuable processing time and create undesirable overhead as a result of the need to track and monitor the threads that are hung. For the foregoing and other reasons, there exists a need to optimize thread processing so as to diminish the likelihood of a thread getting hung.